package dataStructure.chapter03_链表.part1单链表.java1;

/**
 * @author https://gitee.com/W_Jun
 * @date 2022-01-16 9:57
 * @Description 接口和动态数组基本是一样的，只是实现不一定一样，考虑抽取一个公共接口List，让动态数组和链表分别对其实现。
 * 有些方法是和动态数组的实现一样的，如下代码中实现的size、isEmpty、contains、add(E element)、outOfBounds、rangeCheck、rangeCheckForAdd。
 * 考虑如何优化？
 */
public class MyLinkedList<E> implements MyList<E> {
    private int size;
    private Node<E> first;

    private static class Node<E> {
        E element;
        Node<E> next;
        public Node(E element, Node<E> next) {
            this.element = element;
            this.next = next;
        }
    }

    @Override
    public void clear() {

    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean contains(E element) {
        return indexOf(element) != -1;
    }

    @Override
    public void add(E element) {
        add(size, element);
    }

    @Override
    public E get(int index) {
        return null;
    }

    @Override
    public E set(int index, E element) {
        return null;
    }

    @Override
    public void add(int index, E element) {

    }

    @Override
    public E remove(int index) {
        return null;
    }

    @Override
    public int indexOf(E element) {
        return 0;
    }

    /**
     * 检测index的范围，对set、get、remove方法
     * */
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 检测index的范围，对于add方法
     * */
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /**
     * index范围超出，报异常信息
     * */
    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("index：" + index + ", size:" + size);
    }

}
